//////////////////////////////////////////////////////////////////////////////////////////////////////
// 项目名   : RangeFor
// 文件名   : RangeFor.h
// 作者     : Aiye
// 日期     : 2025/8/15 17:48
// 邮箱     : 2878548868@qq.com
// 摘要     : 介绍范围for
//////////////////////////////////////////////////////////////////////////////////////////////////////
#ifndef RANGEFOR_RANGEFOR_H
#define RANGEFOR_RANGEFOR_H
#include <functional>
#include <iostream>
#include <map>
#include <set>
#include <vector>

/*RangeFor 介绍范围for*/
class RangeFor
{
public:
    RangeFor()
    {
        std::vector<int> vecVar{1,2,3,4,5};
        auto it = vecVar.begin();
        for ( ; it != vecVar.end() ; it++)
        {
            std::cout << *it << " " ;
            (*it)++; // 非常量迭代
        }
        std::cout << std::endl; // 常规遍历容器的方法

        for (auto it = vecVar.cbegin() ; it != vecVar.cend() ; it++)
        {
            std::cout << *it << " "; // 常量迭代
        }

        for (auto var : vecVar)
        {
            // 使用范围for是将容器的值拷贝到var，对于较为复杂的数据结构推荐引用
            std::cout << var << " ";
            var++; // 改变的是var与vecVar无关
        }
        std::cout << std::endl;

        for (auto& var : vecVar)
        {
            std::cout << var << " ";
            var++; // 如果是只读数据的话可以在前面加上const
        }

        // 关联型容器像键值对获取的则是std::pair
        std::map<int , std::string> mapVar{{1,"Aiye"},{2,"Aiyea"},{3,"Hello"}};
        for (const auto & var : mapVar)
        {
            std::cout << "Key:" << var.first << " " << "Value:" << var.second;
        }

        // 对于只读的容器则使用const进行修饰
        std::set<int> setVar{1,2,3,3,4,5,6};
        for (const auto& var : setVar)
        {
            std::cout << var << std::endl;
        }

        std::function<std::vector<int>(void)> func = [&vecVar]()->std::vector<int>
        {
            std::cout << "Number of tests performed" << std::endl; //
            return vecVar;
        };

        // 只执行了一次打印函数func
        for (const auto& var : func())
        {
            std::cout << var << " ";
        }
    }
};

#endif //RANGEFOR_RANGEFOR_H